<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/10/19 0019
 * Time: 下午 14:40
 */
//header("content-type:image/jpeg");

class WaChat{
    protected $appId;
    protected $appSecret;
    protected $token;
    function __construct($appId,$appSecret,$token){
        $this->appId = $appId;
        $this->appSecret = $appSecret;
        $this->token = $token;
    }

    /**
     * @param $url
     * @param string $modth
     * @param bool $https
     * @param null $data
     * @return mixed
     * 获取token
     */
    private function __request($url, $method = 'get', $https = true, $data = null){
        $curl = curl_init();                                          //返回的是一个资源  初始化
        curl_setopt($curl, CURLOPT_URL, $url);                        //设置要访问的url
        curl_setopt($curl, CURLOPT_HEADER, FALSE);                   //设置不需要头部信息
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);            //设置只返回 不输出
        if ($https) {
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);//不做客户端认证
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);//不做服务端认证
        }
        if ($method == 'post') {
            curl_setopt($curl, CURLOPT_POST, TRUE);//设置post请求
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//设置post 请求的数据
        }
        $ShuJu = curl_exec($curl);   //开始执行  并保存
        curl_close($curl); //关闭
        return $ShuJu;
    }

    /********************************** 获取到success token ***********************************/
    function getAccesstoken(){
        $file = './accesstoken';                                                   //如果没有回自动生成一个这个名称的文件
        if (file_exists($file)) {
            $content = file_get_contents($file);                                   //如果有这个文件 就得到这个文件里的内容
            $content = json_decode($content);                                      //因为得到的accesstoken是一个json的格式 所以这里要解码 返回的是一个object类型 所以可以用箭头的符号  若这里传第二个参数为true 则返回的是一个数组
            //因为这个token2个小时就会过期 所以判断 如果过期了就再次修改"filemtime" 这个文件修改的时间
            if (time() - filemtime($file) < ($content->expires_in)) {                    //当前时间减去文件创建的时间 小于token的过期时间 就可以用
                return $content->access_token;
            }
        }
        $content = $this->__request("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appId."&secret=".$this->appSecret."");
        file_put_contents($file, $content);                                          //如果没有文件或者过期了  就再去申请一次 写到这个文件里
        $content = json_decode($content);                                           //这里是直接拿刚获取的网页的accesstoken 来解码 并返回
        return $content->access_token;
    }

    /**
     * 获取微信二维码的ticket
     * $expire_seconds 过期时间
     * $type 临时还是永久
     * $scene 应用场景
     */
    function getTicket($expire_seconds = 604800,$type = "temp", $scene = 1){
        if($type == "temp"){ //如果是临时的
            $data = '{"expire_seconds": '.$expire_seconds.', "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": '.$scene.'}}}';
            return $this->__request("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$this->getAccesstoken(),true,"post",$data);
        }else{ //如果是永久的
            $data = '{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": '.$scene.'}}}';
            return $this->__request("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$this->getAccesstoken(),true,"post",$data);
        }
    }

}
define("APPID","wxf7b9092279b1e3a8");
define("APPSECRET","8db0fce10ad12adb5ce15346eb3e9eb5");
define("TOKEN","");
$Wachat = new WaChat(APPID,APPSECRET,TOKEN);
echo $Wachat ->getTicket(604800,"temp",1);      //得到ticket

